草庐IT

Android TalkBack 和 fragment 堆栈

全部标签

c++ - 在 GCC 上的 GTEST 中测试失败时是否有打印堆栈跟踪的选项?

我在Linux上将GTEST与GCC结合使用。我想看到在测试失败时打印的堆栈跟踪(无论是断言还是基于信号的崩溃)。可以做到manually,但我想知道它是否可以设置为GTEST构建/运行选项(无需对我的代码库进行多行修改)? 最佳答案 没有“完全”记录的选项:--gtest_stack_trace_depth=10(10只是示例值)。必须与--gmock_verbose=info一起使用是的-它适用于失败的EXPECT_CALL-仅在gmock中。对于断言(如ASSERT_EQ),它的意义不大-因为ASSERT就在它所在的位置-它的

c - 即使使用 `noexecstack`,堆栈也是可执行的

我正在努力保护我的应用程序免受缓冲区溢出攻击。除其他事项外,我正在使用不可执行的堆栈并将我的二进制文件与noexecstack标志链接(通过将-Wl,-z,noexecstack传递给gcc)。一切似乎都很好-readelf确认PT_GNU_STACK指定了正确的权限:$readelf-ltarget|grep-A1GNU_STACKGNU_STACK0x00000000000000000x00000000000000000x00000000000000000x00000000000000000x0000000000000000RW10execstack也是如此:$execstack-

c - 即使使用 `noexecstack`,堆栈也是可执行的

我正在努力保护我的应用程序免受缓冲区溢出攻击。除其他事项外,我正在使用不可执行的堆栈并将我的二进制文件与noexecstack标志链接(通过将-Wl,-z,noexecstack传递给gcc)。一切似乎都很好-readelf确认PT_GNU_STACK指定了正确的权限:$readelf-ltarget|grep-A1GNU_STACKGNU_STACK0x00000000000000000x00000000000000000x00000000000000000x00000000000000000x0000000000000000RW10execstack也是如此:$execstack-

c - 从/proc/pid/stat 检索当前堆栈指针

我正在使用gdb执行一个基本的C程序。我在main()的开头有一个断点。运行代码后,gdb按预期在main()处中断。现在,如果我检查堆栈指针寄存器(rsp),我会看到0x7fffffffe170:0x00000000.当我使用cat/proc/17232/stat|检索相同的信息时cut-d""-f29/proc(其中17232是此进程的pid),我看到:140737488347112(whichinhexis:0x7fffffffdfe8).为什么我们从gdb中看到了不同的当前堆栈指针值。而且,为什么gdb将rsp的内容显示为NULL(0x00000000)?谢谢。

c - 从/proc/pid/stat 检索当前堆栈指针

我正在使用gdb执行一个基本的C程序。我在main()的开头有一个断点。运行代码后,gdb按预期在main()处中断。现在,如果我检查堆栈指针寄存器(rsp),我会看到0x7fffffffe170:0x00000000.当我使用cat/proc/17232/stat|检索相同的信息时cut-d""-f29/proc(其中17232是此进程的pid),我看到:140737488347112(whichinhexis:0x7fffffffdfe8).为什么我们从gdb中看到了不同的当前堆栈指针值。而且,为什么gdb将rsp的内容显示为NULL(0x00000000)?谢谢。

linux - Linux 中的堆栈预故障 - 需要单个或多个故障

在Linux中,当进程从系统请求一些(虚拟)内存时,它只是在vma(进程虚拟内存的描述符)中注册,但在调用时并未保留每个虚拟内存的物理页面。之后,当进程要访问这个页面时,就会出错(访问会产生PageFault中断),PF#handler会分配物理页面并更新进程页表。有两种情况:读取时出错可能变成链接到写保护的零页(特殊全局预置零页);和写入错误(在零页和只是需要但尚未物理映射的页上)将导致实际的私有(private)物理页分配。对于mmaps(和brk/sbrk,它也是内部mmap),这个方法是每页的;所有mmaped区域都在vma中作为整体注册(它们具有开始和结束地址)。但是堆栈以其

linux - Linux 中的堆栈预故障 - 需要单个或多个故障

在Linux中,当进程从系统请求一些(虚拟)内存时,它只是在vma(进程虚拟内存的描述符)中注册,但在调用时并未保留每个虚拟内存的物理页面。之后,当进程要访问这个页面时,就会出错(访问会产生PageFault中断),PF#handler会分配物理页面并更新进程页表。有两种情况:读取时出错可能变成链接到写保护的零页(特殊全局预置零页);和写入错误(在零页和只是需要但尚未物理映射的页上)将导致实际的私有(private)物理页分配。对于mmaps(和brk/sbrk,它也是内部mmap),这个方法是每页的;所有mmaped区域都在vma中作为整体注册(它们具有开始和结束地址)。但是堆栈以其

linux - 32 位 x86 汇编中堆栈对齐的职责

我试图清楚地了解谁(调用者或被调用者)负责堆栈对齐。64位汇编的情况很清楚,它是由caller完成的。引用SystemVAMD64ABI,第3.2.2节堆栈框架:Theendoftheinputargumentareashallbealignedona16(32,if__m256ispassedonstack)byteboundary.换句话说,应该安全地假设,对于被调用函数的每个入口点:16|(%rsp+8)持有(额外八个是因为call隐含地将返回地址压入堆栈)。它在32位世界中看起来如何(假设cdecl)?我注意到gcc使用以下构造将对齐放在被调用函数中:andesp,-16这似乎

linux - 32 位 x86 汇编中堆栈对齐的职责

我试图清楚地了解谁(调用者或被调用者)负责堆栈对齐。64位汇编的情况很清楚,它是由caller完成的。引用SystemVAMD64ABI,第3.2.2节堆栈框架:Theendoftheinputargumentareashallbealignedona16(32,if__m256ispassedonstack)byteboundary.换句话说,应该安全地假设,对于被调用函数的每个入口点:16|(%rsp+8)持有(额外八个是因为call隐含地将返回地址压入堆栈)。它在32位世界中看起来如何(假设cdecl)?我注意到gcc使用以下构造将对齐放在被调用函数中:andesp,-16这似乎

c - 有没有办法在运行时确定可用的堆栈空间?

我知道堆栈大小是固定的。所以我们不能在堆栈上存储大对象,我们转向动态分配(例如malloc)。此外,当存在函数调用嵌套时会使用堆栈,因此我们也因此避免了递归函数。有没有办法在运行时确定到目前为止使用了多少堆栈内存以及还剩下多少?在这里,我假设使用x86架构的linux环境(gcc编译器)。 最佳答案 有一个pthreadAPI可以确定堆栈的位置:#includevoidPrintStackInfo(void){pthread_attr_tAttributes;void*StackAddress;intStackSize;//Gett